import Dictionary from "./dictionary";

class DictionaryUtils {

    /**
     * 获取数据字典
     *
     * 多数数据字典用的是这个数据字典加载器
     *
     * 如果未获取到数据字典，则返回 undefined，因为是异步载入，因此必须注意页面渲染的生命周期
     *
     * @param key {string}             字典名称
     * @returns {Promise<Dictionary>}  数据字典
     */
    static query(key) {
        return Dictionary.query(key);
    }

    /**
     *
     * 将数组格式化为数据字典
     *
     * @param list {[any]}      任意数组
     * @param label {string}    字段名
     * @param value {string}    字段值
     * @returns {[any]}      数据字典列表
     */
    static wrap(list, label, value) {
        return Layers.wrapArray(list, ele => {
            return {label: ele[label], value: ele[value], ref: ele}
        });
    }


    /**
     * 获取匹配的数据字典
     *
     * @param options   {[]}            数据字典
     * @param value     {any}           值
     * @param compare   {any}           比较函数
     * @returns {DictionaryItem}                数据字典
     */
    static find(options, value, compare) {
        if (Layers.isNotEmpty(options)) {
            for (let i = 0; i < options.length; i++) {
                if (compare(options[i].value, value)) {
                    return options[i];
                }
            }
        }
    }

    /**
     * 获取匹配的数据字典
     *
     * @param options {[]}          数据字典
     * @param value {any}           值
     * @returns {DictionaryItem}            数据字典
     */
    static findByValue(options, value) {
        if (Layers.isNotEmpty(options)) {
            for (let i = 0; i < options.length; i++) {
                if (options[i].value === value) {
                    return options[i];
                }
            }
        }
    }

    /**
     * 按照区间进行数据字典匹配
     *
     * @param options {[]}          数据字典
     * @param value {any}           值
     * @returns {DictionaryItem}            数据字典
     */
    static findByRange(options, value) {
        return this.find(options, value, Layers.isInRange);
    }

    /**
     * 获取匹配的数据字典
     *
     * @param options {[]}      数据字典
     * @param value {any}       值
     * @param def {string}      默认值
     * @returns {string}        对应的 label
     */
    static getLabelByValue(options, value, def) {
        let dic = DictionaryUtils.findByValue(options, value);
        if (Layers.isNotBlank(dic)) {
            return dic.label;
        } else {
            return def ? def : value;
        }
    }
}

export default DictionaryUtils;